package vip.liux.contracts.security.core.extensions;


import vip.liux.contracts.models.identity.vo.UserLoginInfo;

import java.util.List;
import java.util.Optional;

/**
 * 提供用于存储外部登录信息与用户账户映射的抽象接口。
 *
 * @param <TUser> 表示用户的类型。
 */
public interface IUserLoginStore<TUser> extends IUserStore<TUser> {
    /**
     * 为指定用户添加外部登录信息。
     *
     * @param user  要添加登录信息的用户。
     * @param login 外部登录信息。
     */
    void addLogin(TUser user, UserLoginInfo login);

    /**
     * 尝试移除指定用户的外部登录信息，并返回是否成功。
     *
     * @param user          要移除登录信息的用户。
     * @param loginProvider 登录提供者。
     * @param providerKey   外部登录提供者的唯一标识。
     */
    void removeLogin(TUser user, String loginProvider, String providerKey);

    /**
     * 获取指定用户的所有外部登录信息。
     *
     * @param user 要查询的用户。
     * @return 外部登录信息列表。
     */
    List<UserLoginInfo> getLogins(TUser user);

    /**
     * 通过登录提供者和提供者 key 查找用户。
     *
     * @param loginProvider 登录提供者。
     * @param providerKey   提供者 key。
     * @return 匹配的用户，若无则为 Optional.empty()。
     */
    Optional<TUser> findByLogin(String loginProvider, String providerKey);
}